package edu.tyut.game.ui.community

import android.content.Context
import android.content.Intent
import android.graphics.Bitmap
import android.net.Uri
import android.os.Environment
import android.provider.MediaStore
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.Toast
import androidx.appcompat.app.AlertDialog
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.bumptech.glide.load.DataSource
import com.bumptech.glide.load.engine.GlideException
import com.bumptech.glide.request.RequestListener
import com.bumptech.glide.request.target.Target
import edu.tyut.game.R
import edu.tyut.game.logic.network.ServiceCreator
import edu.tyut.game.utils.LogUtils
import java.io.File
import java.io.FileNotFoundException
import java.io.FileOutputStream
import java.io.IOException


class ImageViewAdapter(private val context: Context, private val urls: List<String>) :
    RecyclerView.Adapter<ImageViewAdapter.ViewHolder>() {

    private val tag = this::class.java.name

    inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        val image: ImageView = view.findViewById(R.id.image_each)
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val view =
            LayoutInflater.from(context).inflate(R.layout.layout_image_view_item, parent, false)
        return ViewHolder(view)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val url = "${ServiceCreator.BASE_URL}${urls[position]}"
        Glide.with(context).load(url).into(holder.image)
        // 长按保存图片
        holder.image.setOnLongClickListener {
            // dialog学习
            val dialog = AlertDialog.Builder(context)
                .setIcon(R.drawable.image5) // 设置标题的图片
                .setTitle("图片保存😊") // 设置对话框的标题
                .setMessage("是否要保存图片😁？") // 设置对话框内容
                .setNegativeButton("取消") { dialog, _ ->
                    run {
                        Toast.makeText(context, "图片未保存😥", Toast.LENGTH_SHORT).show()
                        dialog.cancel()
                    }
                }
                .setPositiveButton("确定") { dialog, _ ->
                    dialog.dismiss()
                    saveImage(url)
                    Toast.makeText(context, "图片保存成功😊", Toast.LENGTH_SHORT).show()
                }
                .create()
            dialog.show()
            LogUtils.d(tag, "长按保存图片")
            return@setOnLongClickListener true
        }
    }

    override fun getItemCount() = urls.size

    // 长按保存图片
    private fun saveImage(url: String) {
        Glide.with(context)
            .asBitmap() // 指定格式为Bitmap
            .load(url)
            .listener(object : RequestListener<Bitmap?> {
                override fun onLoadFailed(
                    e: GlideException?,
                    model: Any,
                    target: Target<Bitmap?>,
                    isFirstResource: Boolean
                ): Boolean {
                    // 加载失败
                    Toast.makeText(context, "图片加载失败", Toast.LENGTH_LONG).show()
                    return false
                }

                override fun onResourceReady(
                    resource: Bitmap?,
                    model: Any?,
                    target: Target<Bitmap?>?,
                    dataSource: DataSource?,
                    isFirstResource: Boolean
                ): Boolean {
                    // 加载成功，resource为加载到的bitmap
                    resource?.let {
                        saveBitmap(context, it)
                        Toast.makeText(context, "图片保存成功", Toast.LENGTH_LONG).show()
                    }
                    return false
                }
            })
            .into(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL) // 加载原图大小
    }

    /*
     * 将图片 bitmap 保存到图库
     */
    fun saveBitmap(activity: Context, bitmap: Bitmap) {
        // 因为xml用的是背景，所以这里也是获得背景
        // 获取参数Bitmap方式一： Bitmap bitmap=((BitmapDrawable)(imageView.getBackground())).getBitmap();
        // 获取参数Bitmap方式二： Bitmap image = ((BitmapDrawable)imageView.getDrawable()).getBitmap();
        // t设置图片名称，要保存png，这里后缀就是png，要保存jpg，后缀就用jpg
        val imageName = System.currentTimeMillis().toString() + "code.png"

        // 创建文件，安卓低版本的方式
        //  File file=new File(Environment.getExternalStorageDirectory() +"/test.png");

        // Android Q  10为每个应用程序提供了一个独立的在外部存储设备的存储沙箱，没有其他应用可以直接访问您应用的沙盒文件
        val f = activity.getExternalFilesDir(Environment.DIRECTORY_PICTURES)
        val file = File(f!!.path + "/" + imageName) // 创建文件
        //        file.getParentFile().mkdirs();
        try {
            // 文件输出流
            val fileOutputStream = FileOutputStream(file)
            // 压缩图片，如果要保存png，就用Bitmap.CompressFormat.PNG，要保存jpg就用Bitmap.CompressFormat.JPEG,质量是100%，表示不压缩
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream)
            // 写入，这里会卡顿，因为图片较大
            fileOutputStream.flush()
            // 记得要关闭写入流
            fileOutputStream.close()
            // 成功的提示，写入成功后，请在对应目录中找保存的图片
            LogUtils.e(tag, "写入成功！位置目录: ${f.path}/$imageName")
        } catch (e: FileNotFoundException) {
            e.printStackTrace()
            // 失败的提示，这里的Toast工具类，大家用自己项目中的即可，若不需要可以删除
            LogUtils.e(tag, e.message.toString())
        } catch (e: IOException) {
            e.printStackTrace()
            // 失败的提示
            LogUtils.e(tag, e.message.toString())
        }

        // 下面的步骤必须有，不然在相册里找不到图片，若不需要让用户知道你保存了图片，可以不写下面的代码。
        // 把文件插入到系统图库
        try {
            MediaStore.Images.Media.insertImage(
                activity.contentResolver,
                file.absolutePath, imageName, null
            )
            LogUtils.d(tag, "保存成功，请您到 相册/图库 中查看")
        } catch (e: FileNotFoundException) {
            LogUtils.d(tag, "保存失败")
            e.printStackTrace()
        }
        // 最后通知图库更新
        activity.sendBroadcast(
            Intent(
                Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
                Uri.fromFile(File(file.path))
            )
        )
    }
}